package com.smart.community.property.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.smart.community.commons.entity.property.PropertyCompanyCommunity;
import com.smart.community.commons.result.Result;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 物业公司社区关联服务接口
 * @author Wu.Liang
 * @since 2025-01-29
 */
public interface IPropertyCompanyCommunityService extends IService<PropertyCompanyCommunity> {
    
    /**
     * 为物业公司分配社区
     * @param propertyCompanyId 物业公司ID
     * @param communityIds 社区ID列表
     * @return 操作结果
     * @throws Exception 统一异常
     */
    Result<String> assignCommunitiesToPropertyCompany(Long propertyCompanyId, List<Long> communityIds) throws Exception;
    
    /**
     * 为物业公司分配社区（Feign接口专用，跳过权限检查）
     * @param propertyCompanyId 物业公司ID
     * @param communityIds 社区ID列表
     * @throws Exception 统一异常
     */
    void assignCommunitiesToPropertyCompanyWithoutPermission(Long propertyCompanyId, List<Long> communityIds) throws Exception;
    
    /**
     * 移除物业公司与社区的关联
     * @param id 关联记录ID
     * @return 操作结果
     * @throws Exception 统一异常
     */
    Result<String> removePropertyCompanyCommunity(Long id) throws Exception;
    
    /**
     * 批量移除物业公司与社区的关联
     * @param propertyCompanyId 物业公司ID
     * @param communityIds 社区ID列表
     * @return 操作结果
     * @throws Exception 统一异常
     */
    Result<String> batchRemovePropertyCompanyCommunities(Long propertyCompanyId, List<Long> communityIds) throws Exception;
    
    /**
     * 获取物业公司关联的社区列表
     * @param propertyCompanyId 物业公司ID
     * @return 物业公司关联列表
     * @throws Exception 统一异常
     */
    List<PropertyCompanyCommunity> getPropertyCompanyCommunities(Long propertyCompanyId) throws Exception;
    
    /**
     * 根据物业公司ID获取关联的社区ID集合
     * @param propertyCompanyId 物业公司ID
     * @return 社区ID集合
     * @throws Exception 统一异常
     */
    List<Long> getCommunityIdsByPropertyCompanyId(Long propertyCompanyId) throws Exception;
    
    /**
     * 获取社区关联的物业公司列表
     * @param communityId 社区ID
     * @return 社区列表
     * @throws Exception 统一异常
     */
    List<PropertyCompanyCommunity> getCommunityPropertyCompanies(Long communityId) throws Exception;
    
    /**
     * 获取社区当前的物业公司
     * @param communityId 社区ID
     * @return 物业公司关联信息
     * @throws Exception 统一异常
     */
    PropertyCompanyCommunity getCurrentPropertyCompanyForCommunity(Long communityId) throws Exception;
    
    /**
     * 根据社区ID获取物业公司ID
     * @param communityId 社区ID
     * @return 物业公司ID，如果没有关联则返回null
     * @throws Exception 统一异常
     */
    Long getPropertyCompanyIdByCommunityId(Long communityId) throws Exception;
    
    /**
     * 查询可分配的社区列表
     * @param propertyCompanyId 物业公司ID
     * @param searchKeyword 搜索关键词（可选）
     * @return 可分配的社区列表
     * @throws Exception 统一异常
     */
    List<Object> getAvailableCommunities(Long propertyCompanyId, String searchKeyword) throws Exception;
    
    /**
     * 获取物业公司社区关联统计
     * @param propertyCompanyId 物业公司ID
     * @return 统计信息
     * @throws Exception 统一异常
     */
    Object getPropertyCompanyCommunityStats(Long propertyCompanyId) throws Exception;
    
    /**
     * 检查物业公司是否已关联社区
     * @param propertyCompanyId 物业公司ID
     * @param communityId 社区ID
     * @return 是否已关联
     * @throws Exception 统一异常
     */
    boolean isPropertyCompanyAssignedToCommunity(Long propertyCompanyId, Long communityId) throws Exception;
    
    /**
     * 检查用户是否有查看权限
     * @param userId 用户ID
     * @param propertyCompanyId 物业公司ID
     * @return 是否有权限
     * @throws Exception 统一异常
     */
    boolean hasViewPermission(Long userId, Long propertyCompanyId) throws Exception;
    
    /**
     * 检查用户是否有分配权限
     * @param userId 用户ID
     * @param propertyCompanyId 物业公司ID
     * @return 是否有权限
     * @throws Exception 统一异常
     */
    boolean hasAssignPermission(Long userId, Long propertyCompanyId) throws Exception;
    
    /**
     * 检查用户是否有移除权限
     * @param userId 用户ID
     * @param id 关联记录ID
     * @return 是否有权限
     * @throws Exception 统一异常
     */
    boolean hasRemovePermission(Long userId, Long id) throws Exception;
    
    /**
     * 为物业公司分配社区
     * @param propertyCompanyId 物业公司ID
     * @param communityId 社区ID
     * @param serviceStartDate 服务开始日期
     * @param serviceEndDate 服务结束日期
     * @param contractNo 合同编号
     * @param serviceFee 服务费用
     * @param serviceContent 服务内容
     * @return 操作结果
     * @throws Exception 统一异常
     */
    Result<Void> assignCommunityToPropertyCompany(Long propertyCompanyId, Long communityId,
                                                 LocalDate serviceStartDate, LocalDate serviceEndDate,
                                                 String contractNo, BigDecimal serviceFee, String serviceContent) throws Exception;
    
    /**
     * 更新物业公司社区关联信息
     * @param propertyCompanyId 物业公司ID
     * @param communityId 社区ID
     * @param serviceStartDate 服务开始日期
     * @param serviceEndDate 服务结束日期
     * @param contractNo 合同编号
     * @param serviceFee 服务费用
     * @param serviceContent 服务内容
     * @return 操作结果
     * @throws Exception 统一异常
     */
    Result<Void> updatePropertyCompanyCommunityInfo(Long propertyCompanyId, Long communityId,
                                                   LocalDate serviceStartDate, LocalDate serviceEndDate,
                                                   String contractNo, BigDecimal serviceFee, String serviceContent) throws Exception;
} 